{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Combinatorial Promoters" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Overview\n", "\n", "The CombinatorialPromoter is supposed to represent the general case where a promoter is transcribable when bound by a specific combination of regulators.\n", "\n", "In general, consider a set of $M$ regulators $R_1...R_M$ which bind to the promoter $P$ with cooperativities $n_1...n_M$ ie $n_i$ copies of $R_i$ bind to the promoter at once. The CombinatorialPromoter enumerates all possible bound Promoter-Regulator complexes which are returned as a list of ComplexSpecies using the Combinatorial_Cooperative_Binding Mechanism. These complexes will be default take the following form with the regulators in alphabetical order:\n", "$$\n", "\\begin{aligned}\n", " \\textrm{Species}=\\{&P, P:n_1\\textrm{x}R_1, &&..., P:n_M\\textrm{x}R_M, \\\\\n", " &P:n_1\\textrm{x}R_1:n_2\\textrm{x}R_2, &&..., P:n_{M-1}\\textrm{x}R_{M-1}:n_M\\textrm{x}R_M \\\\\n", " && \\vdots \\\\\n", " &P:n_1\\textrm{x}R_1:n_2\\textrm{x}R_2: &&...:n_{M-1}\\textrm{x}R_{M-1}:n_M\\textrm{x}R_M \\}\n", "\\end{aligned}\n", "$$\n", "\n", "The Combinatorial_Cooperative_Binding Mechanism in Combinatorial Promoter returns all reactions where a Complex consisting of a promoter and a set of regulators bind to one additional regulator:\n", "\n", "$$\n", "\\begin{aligned}\n", "\\textrm{Reactions} = \n", "\\{&P + n_1 R_1 \\leftrightarrow P:n_1\\textrm{x}R_1, ...\\\\\n", " &..., P + n_M R_M \\leftrightarrow P:n_M\\textrm{x}R_M, ... \\\\\n", " &..., P:n_1\\textrm{x}R_1 + n_2 R_2 \\leftrightarrow P:n_1\\textrm{x}R_1:n_2\\textrm{x}R_2,... \\\\\n", " &..., P:n_{M-1}\\textrm{x}R_{M-1} + n_M R_M \\leftrightarrow P:n_{M-1}\\textrm{x}R_{M-1}:n_M\\textrm{x}R_M, ... \\\\\n", " & \\vdots \\\\\n", " &..., P:n_1\\textrm{x}R_1:n_2\\textrm{x}R_2:...:n_{M-1}\\textrm{x}R_{M-1} + n_M R_M\n", " \\leftrightarrow\n", " P:n_1\\textrm{x}R_1:n_2\\textrm{x}R_2:...:n_{M-1}\\textrm{x}R_{M-1}:n_M\\textrm{x}R_M\n", "\\end{aligned}\n", "$$\n", "\n", "Arbitrary combinations of these regulators can be defined as transcribable using::\n", "\n", " CombinatorialPromoter(name, [Regulators], tx_capable_list = [[Transcribable Combination fo regulators 1], [Combination 2], ...]) \n", "\n", "Additionally, there is the option for leak reactions in which case the free promoter is transcribed at some leak rate::\n", "\n", " CombinatorialPromoter(name, [Regulators], leak = True/False ) \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Below are imports required for these examples and plotting." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "please install the plotting libraries: pip install biocrnpyler[all]\n" ] }, { "data": { "text/html": [ " \n", "
\n", " \n", " Loading BokehJS ...\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "'use strict';\n", "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " const force = true;\n", "\n", " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", "const JS_MIME_TYPE = 'application/javascript';\n", " const HTML_MIME_TYPE = 'text/html';\n", " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " const CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " const script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " function drop(id) {\n", " const view = Bokeh.index.get_by_id(id)\n", " if (view != null) {\n", " view.model.document.clear()\n", " Bokeh.index.delete(view)\n", " }\n", " }\n", "\n", " const cell = handle.cell;\n", "\n", " const id = cell.output_area._bokeh_element_id;\n", " const server_id = cell.output_area._bokeh_server_id;\n", "\n", " // Clean up Bokeh references\n", " if (id != null) {\n", " drop(id)\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd_clean, {\n", " iopub: {\n", " output: function(msg) {\n", " const id = msg.content.text.trim()\n", " drop(id)\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd_destroy);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " const output_area = handle.output_area;\n", " const output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " const bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " const script_attrs = bk_div.children[0].attributes;\n", " for (let i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " const toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " const events = require('base/js/events');\n", " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " const NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded(error = null) {\n", " const el = document.getElementById(\"a56c2369-b1ce-4424-9912-ad98a58871c9\");\n", " if (el != null) {\n", " const html = (() => {\n", " if (typeof root.Bokeh === \"undefined\") {\n", " if (error == null) {\n", " return \"BokehJS is loading ...\";\n", " } else {\n", " return \"BokehJS failed to load.\";\n", " }\n", " } else {\n", " const prefix = `BokehJS ${root.Bokeh.version}`;\n", " if (error == null) {\n", " return `${prefix} successfully loaded.`;\n", " } else {\n", " return `${prefix} encountered errors while loading and may not function as expected.`;\n", " }\n", " }\n", " })();\n", " el.innerHTML = html;\n", "\n", " if (error != null) {\n", " const wrapper = document.createElement(\"div\");\n", " wrapper.style.overflow = \"auto\";\n", " wrapper.style.height = \"5em\";\n", " wrapper.style.resize = \"vertical\";\n", " const content = document.createElement(\"div\");\n", " content.style.fontFamily = \"monospace\";\n", " content.style.whiteSpace = \"pre-wrap\";\n", " content.style.backgroundColor = \"rgb(255, 221, 221)\";\n", " content.textContent = error.stack ?? error.toString();\n", " wrapper.append(content);\n", " el.append(wrapper);\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(() => display_loaded(error), 100);\n", " }\n", " }\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) {\n", " if (callback != null)\n", " callback();\n", " });\n", " } finally {\n", " delete root._bokeh_onload_callbacks\n", " }\n", " console.debug(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(css_urls, js_urls, callback) {\n", " if (css_urls == null) css_urls = [];\n", " if (js_urls == null) js_urls = [];\n", "\n", " root._bokeh_onload_callbacks.push(callback);\n", " if (root._bokeh_is_loading > 0) {\n", " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", "\n", " function on_load() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", " run_callbacks()\n", " }\n", " }\n", "\n", " function on_error(url) {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " for (let i = 0; i < css_urls.length; i++) {\n", " const url = css_urls[i];\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.rel = \"stylesheet\";\n", " element.type = \"text/css\";\n", " element.href = url;\n", " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", " document.body.appendChild(element);\n", " }\n", "\n", " for (let i = 0; i < js_urls.length; i++) {\n", " const url = js_urls[i];\n", " const element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.async = false;\n", " element.src = url;\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " };\n", "\n", " function inject_raw_css(css) {\n", " const element = document.createElement(\"style\");\n", " element.appendChild(document.createTextNode(css));\n", " document.body.appendChild(element);\n", " }\n", "\n", " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.3.min.js\"];\n", " const css_urls = [];\n", "\n", " const inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " if (root.Bokeh !== undefined || force === true) {\n", " try {\n", " for (let i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }\n", "\n", " } catch (error) {display_loaded(error);throw error;\n", " }if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " const cell = $(document.getElementById(\"a56c2369-b1ce-4424-9912-ad98a58871c9\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", " }\n", "\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(css_urls, js_urls, function() {\n", " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(window));" ], "application/vnd.bokehjs_load.v0+json": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"a56c2369-b1ce-4424-9912-ad98a58871c9\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"a56c2369-b1ce-4424-9912-ad98a58871c9\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#Using Bioscrape: Basic Imports\n", "#from bioscrape.types import Model\n", "#from bioscrape.simulator import py_simulate_model\n", "#For arrays and plotting\n", "\n", "try:\n", " import numpy as np\n", " import pylab as plt\n", " make_heatmap = True\n", " import numpy as np\n", " import pylab as plt\n", " import bioscrape\n", " import seaborn as sns\n", " import pandas as pd\n", "except ModuleNotFoundError:\n", " make_heatmap = False\n", " print('please install the plotting libraries: pip install biocrnpyler[all]')\n", "\n", "#this is for the network representation\n", "try:\n", " import bokeh.plotting\n", " import bokeh.io\n", " bokeh.io.output_notebook()\n", " plotCRN = True\n", "except (ModuleNotFoundError,ImportError) as e:\n", " plotCRN = False\n", " print('please install the plotting libraries: pip install biocrnpyler[all]')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 1: Default Behavior to Produce AND logic with leak\n", "In the following example, we consider a promoter phrpL which can be bound by the proteins hrpR and hrpS. When both proteins are present, transcription is activated, but when one or the other (or none) is present, transcription is not activated." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The species and reactions in the CRN:\n", " Species(N = 18) = {\n", " protein[Ribo] (@ 24.0), \n", " found_key=(mech=None, partid=e coli extract 1, name=Ribo).\n", " search_key=(mech=initial concentration, partid=e coli extract 1, name=Ribo).\n", "\n", " protein[RNAase] (@ 6.0), \n", " found_key=(mech=None, partid=e coli extract 1, name=RNAase).\n", " search_key=(mech=initial concentration, partid=e coli extract 1, name=RNAase).\n", "\n", " protein[RNAP] (@ 3.0), \n", " found_key=(mech=None, partid=e coli extract 1, name=RNAP).\n", " search_key=(mech=initial concentration, partid=e coli extract 1, name=RNAP).\n", "\n", " complex[protein[Ribo]:rna[mydna]] (@ 0), \n", " complex[protein[RNAase]:rna[mydna]] (@ 0), \n", " rna[mydna] (@ 0), \n", " dna[mydna] (@ 0), \n", " protein[hrpS] (@ 0), \n", " protein[hrpR] (@ 0), \n", " complex[dna[mydna]:protein[hrpS]] (@ 0), \n", " complex[dna[mydna]:protein[hrpR]:protein[hrpS]] (@ 0), \n", " complex[dna[mydna]:protein[hrpR]] (@ 0), \n", " complex[dna[mydna]:protein[RNAP]] (@ 0), \n", " complex[complex[protein[Ribo]:rna[mydna]]:protein[RNAase]] (@ 0), \n", " complex[complex[dna[mydna]:protein[hrpS]]:protein[RNAP]] (@ 0), \n", " complex[complex[dna[mydna]:protein[hrpR]:protein[hrpS]]:protein[RNAP]] (@ 0), \n", " complex[complex[dna[mydna]:protein[hrpR]]:protein[RNAP]] (@ 0), \n", " protein[GFP] (@ 0), \n", "}\n", "\n", "Reactions (18) = [\n", "0. dna[mydna]+protein[RNAP] <--> complex[dna[mydna]:protein[RNAP]]\n", " Kf=k_forward * dna_mydna * protein_RNAP\n", " Kr=k_reverse * complex_dna_mydna_protein_RNAP_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=transcription_mm, partid=phrpL_leak, name=kb).\n", " k_reverse=100\n", " found_key=(mech=None, partid=phrpL_leak, name=ku).\n", " search_key=(mech=transcription_mm, partid=phrpL_leak, name=ku).\n", "\n", "1. complex[dna[mydna]:protein[RNAP]] --> dna[mydna]+rna[mydna]+protein[RNAP]\n", " Kf=k_forward * complex_dna_mydna_protein_RNAP_\n", " k_forward=0.01\n", " found_key=(mech=None, partid=phrpL_leak, name=ktx).\n", " search_key=(mech=transcription_mm, partid=phrpL_leak, name=ktx).\n", "\n", "2. protein[hrpR]+dna[mydna] <--> complex[dna[mydna]:protein[hrpR]]\n", " Kf=k_forward * protein_hrpR * dna_mydna\n", " Kr=k_reverse * complex_dna_mydna_protein_hrpR_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=Combinatorial_Cooperative_binding, partid=phrpL_hrpR, name=kb).\n", " k_reverse=50\n", " found_key=(mech=None, partid=phrpL_hrpR, name=ku).\n", " search_key=(mech=Combinatorial_Cooperative_binding, partid=phrpL_hrpR, name=ku).\n", "\n", "3. protein[hrpS]+dna[mydna] <--> complex[dna[mydna]:protein[hrpS]]\n", " Kf=k_forward * protein_hrpS * dna_mydna\n", " Kr=k_reverse * complex_dna_mydna_protein_hrpS_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=Combinatorial_Cooperative_binding, partid=phrpL_hrpS, name=kb).\n", " k_reverse=50\n", " found_key=(mech=None, partid=phrpL_hrpS, name=ku).\n", " search_key=(mech=Combinatorial_Cooperative_binding, partid=phrpL_hrpS, name=ku).\n", "\n", "4. protein[hrpR]+complex[dna[mydna]:protein[hrpS]] <--> complex[dna[mydna]:protein[hrpR]:protein[hrpS]]\n", " Kf=k_forward * protein_hrpR * complex_dna_mydna_protein_hrpS_\n", " Kr=k_reverse * complex_dna_mydna_protein_hrpR_protein_hrpS_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=Combinatorial_Cooperative_binding, partid=phrpL_hrpR, name=kb).\n", " k_reverse=50\n", " found_key=(mech=None, partid=phrpL_hrpR, name=ku).\n", " search_key=(mech=Combinatorial_Cooperative_binding, partid=phrpL_hrpR, name=ku).\n", "\n", "5. protein[hrpS]+complex[dna[mydna]:protein[hrpR]] <--> complex[dna[mydna]:protein[hrpR]:protein[hrpS]]\n", " Kf=k_forward * protein_hrpS * complex_dna_mydna_protein_hrpR_\n", " Kr=k_reverse * complex_dna_mydna_protein_hrpR_protein_hrpS_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=Combinatorial_Cooperative_binding, partid=phrpL_hrpS, name=kb).\n", " k_reverse=50\n", " found_key=(mech=None, partid=phrpL_hrpS, name=ku).\n", " search_key=(mech=Combinatorial_Cooperative_binding, partid=phrpL_hrpS, name=ku).\n", "\n", "6. complex[dna[mydna]:protein[hrpR]]+protein[RNAP] <--> complex[complex[dna[mydna]:protein[hrpR]]:protein[RNAP]]\n", " Kf=k_forward * complex_dna_mydna_protein_hrpR_ * protein_RNAP\n", " Kr=k_reverse * complex_complex_dna_mydna_protein_hrpR__protein_RNAP_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=transcription_mm, partid=phrpL_hrpR_RNAP, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=transcription_mm, partid=phrpL_hrpR_RNAP, name=ku).\n", "\n", "7. complex[complex[dna[mydna]:protein[hrpR]]:protein[RNAP]] --> complex[dna[mydna]:protein[hrpR]]+rna[mydna]+protein[RNAP]\n", " Kf=k_forward * complex_complex_dna_mydna_protein_hrpR__protein_RNAP_\n", " k_forward=0.05\n", " found_key=(mech=None, partid=None, name=ktx).\n", " search_key=(mech=transcription_mm, partid=phrpL_hrpR_RNAP, name=ktx).\n", "\n", "8. complex[dna[mydna]:protein[hrpS]]+protein[RNAP] <--> complex[complex[dna[mydna]:protein[hrpS]]:protein[RNAP]]\n", " Kf=k_forward * complex_dna_mydna_protein_hrpS_ * protein_RNAP\n", " Kr=k_reverse * complex_complex_dna_mydna_protein_hrpS__protein_RNAP_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=transcription_mm, partid=phrpL_hrpS_RNAP, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=transcription_mm, partid=phrpL_hrpS_RNAP, name=ku).\n", "\n", "9. complex[complex[dna[mydna]:protein[hrpS]]:protein[RNAP]] --> complex[dna[mydna]:protein[hrpS]]+rna[mydna]+protein[RNAP]\n", " Kf=k_forward * complex_complex_dna_mydna_protein_hrpS__protein_RNAP_\n", " k_forward=0.05\n", " found_key=(mech=None, partid=None, name=ktx).\n", " search_key=(mech=transcription_mm, partid=phrpL_hrpS_RNAP, name=ktx).\n", "\n", "10. complex[dna[mydna]:protein[hrpR]:protein[hrpS]]+protein[RNAP] <--> complex[complex[dna[mydna]:protein[hrpR]:protein[hrpS]]:protein[RNAP]]\n", " Kf=k_forward * complex_dna_mydna_protein_hrpR_protein_hrpS_ * protein_RNAP\n", " Kr=k_reverse * complex_complex_dna_mydna_protein_hrpR_protein_hrpS__protein_RNAP_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=transcription_mm, partid=phrpL_hrpR_hrpS_RNAP, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=transcription_mm, partid=phrpL_hrpR_hrpS_RNAP, name=ku).\n", "\n", "11. complex[complex[dna[mydna]:protein[hrpR]:protein[hrpS]]:protein[RNAP]] --> complex[dna[mydna]:protein[hrpR]:protein[hrpS]]+rna[mydna]+protein[RNAP]\n", " Kf=k_forward * complex_complex_dna_mydna_protein_hrpR_protein_hrpS__protein_RNAP_\n", " k_forward=0.05\n", " found_key=(mech=None, partid=None, name=ktx).\n", " search_key=(mech=transcription_mm, partid=phrpL_hrpR_hrpS_RNAP, name=ktx).\n", "\n", "12. rna[mydna]+protein[Ribo] <--> complex[protein[Ribo]:rna[mydna]]\n", " Kf=k_forward * rna_mydna * protein_Ribo\n", " Kr=k_reverse * complex_protein_Ribo_rna_mydna_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=translation_mm, partid=B0030, name=kb).\n", " k_reverse=10.0\n", " found_key=(mech=translation_mm, partid=B0030, name=ku).\n", " search_key=(mech=translation_mm, partid=B0030, name=ku).\n", "\n", "13. complex[protein[Ribo]:rna[mydna]] --> rna[mydna]+protein[GFP]+protein[Ribo]\n", " Kf=k_forward * complex_protein_Ribo_rna_mydna_\n", " k_forward=1.5\n", " found_key=(mech=translation_mm, partid=B0030, name=ktl).\n", " search_key=(mech=translation_mm, partid=B0030, name=ktl).\n", "\n", "14. complex[protein[Ribo]:rna[mydna]]+protein[RNAase] <--> complex[complex[protein[Ribo]:rna[mydna]]:protein[RNAase]]\n", " Kf=k_forward * complex_protein_Ribo_rna_mydna_ * protein_RNAase\n", " Kr=k_reverse * complex_complex_protein_Ribo_rna_mydna__protein_RNAase_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=rna_degradation_mm, partid=complex_protein_Ribo_rna_mydna_, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=rna_degradation_mm, partid=complex_protein_Ribo_rna_mydna_, name=ku).\n", "\n", "15. complex[complex[protein[Ribo]:rna[mydna]]:protein[RNAase]] --> protein[Ribo]+protein[RNAase]\n", " Kf=k_forward * complex_complex_protein_Ribo_rna_mydna__protein_RNAase_\n", " k_forward=0.000555556\n", " found_key=(mech=rna_degradation_mm, partid=None, name=kdeg).\n", " search_key=(mech=rna_degradation_mm, partid=complex_protein_Ribo_rna_mydna_, name=kdeg).\n", "\n", "16. rna[mydna]+protein[RNAase] <--> complex[protein[RNAase]:rna[mydna]]\n", " Kf=k_forward * rna_mydna * protein_RNAase\n", " Kr=k_reverse * complex_protein_RNAase_rna_mydna_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=rna_degradation_mm, partid=rna_mydna, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=rna_degradation_mm, partid=rna_mydna, name=ku).\n", "\n", "17. complex[protein[RNAase]:rna[mydna]] --> protein[RNAase]\n", " Kf=k_forward * complex_protein_RNAase_rna_mydna_\n", " k_forward=0.000555556\n", " found_key=(mech=rna_degradation_mm, partid=None, name=kdeg).\n", " search_key=(mech=rna_degradation_mm, partid=rna_mydna, name=kdeg).\n", "\n", "]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:678: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].\n", " warn(\n" ] } ], "source": [ "from biocrnpyler.components import Protein, DNAassembly, CombinatorialPromoter\n", "from biocrnpyler.mixtures import TxTlExtract\n", "#these are the additional parameters that you need:\n", "parameters = {\n", " (None, 'phrpL_hrpR', 'cooperativity'): 1.0, #default is 2, but these proteins bind at cooperativity = 1\n", " (None, 'phrpL_hrpS', 'cooperativity'): 1.0, \n", " (None, 'phrpL_hrpR', 'ku'):50, #these are the regulator unbinding rates\n", " (None, 'phrpL_hrpS', 'ku'):50,\n", " (None, 'phrpL_leak', 'ktx'): 0.01, #this is the leak rate\n", " (None, 'phrpL_leak', 'ku'): 100, #this is the leak polymerase unbinding rate\n", "\n", " ('translation_mm', 'B0030', 'ku'): 10.0, #Unbinding\n", " ('translation_mm', 'B0030', 'ktl'): 1.5, #Translation Rate\n", "\n", " \"kb\":100, \"ku\":10, \"ktx\":.05, \"ktl\":.2, \"kdeg\":2 #some default parameters\n", "}\n", "#above you can see the desired part_id is very simple. The general syntax is _.\n", "#using this syntax you can define the strength of binding of each regulator to the promoter.\n", "#cooperativity between different regulators is not supported.\n", "\n", "#you can also define the transcription rate and binding and unbinding (kb or ku) of polymerase from a transcribable\n", "#complex. A transcribable complex is a promoter with regulators bound that is capable of transcription.\n", "\n", "#By default, all combinations of regulators bound will be capable of transcription. They will use the \"ktx\" parameter\n", "#promoter with nothing bound will use the phrpL_leak parameter\n", "\n", "\n", "#now we define the proteins. Their names should match what you put in the promoter, below\n", "hrpR = Protein(\"hrpR\")\n", "hrpS = Protein(\"hrpS\")\n", "\n", "#Define the promoter\n", "\n", "#this is an \"AND gate\" promoter. That means that it only leads to transcript if both regulators are bound\n", "#binding of one or the other regulator should not lead to any transcription\n", "#this is the network:\n", "# hrpR + mydna <--> mydna:hrpR\n", "# hrpS + mydna <--> mydna:hrpS\n", "# hrpR + mydna:hrpS <--> mydna:hrpR:hrpS\n", "# hrpS + mydna:hrpR <--> mydna:hrpR:hrpS\n", "\n", "phrpL = CombinatorialPromoter(\"phrpL\", regulators=[\"hrpR\",\"hrpS\"], leak=True) \n", "#this defines a promoter which binds hrpR and hrpS, and it leaks. \n", "#By default, leak only happens when there is nothing bound to the DNA.\n", "#this also means that in this promoter, individually bound species (with only one regulator) will not lead to\n", "#any transcription! This means they will not leak also.\n", "\n", "#this is our DNA\n", "dna = DNAassembly(\"mydna\",promoter=phrpL, rbs=\"B0030\", protein=\"GFP\")\n", "\n", "#TxTl Extract is a Mixture with more complex internal models\n", "extract_1_TXTL = TxTlExtract(\n", " name=\"e coli extract 1\", components = [dna,hrpR,hrpS], \n", " parameters=parameters, parameter_file = \"default_parameters.txt\", \n", " overwrite_parameters = True) #Overwrite parameters will overwrite the parameters in the file with the dictionary\n", "CRN_extract_1 = extract_1_TXTL.compile_crn()\n", "\n", "print(\"The species and reactions in the CRN:\\n\", CRN_extract_1.pretty_print())\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/utils/plotting.py:203: UserWarning: Node keys in 'layout_function' don't match node keys in the graph. These nodes may not be displayed correctly.\n", " reaction_renderer = from_networkx(DGreactions, positions, center=(0, 0))\n", "/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/utils/plotting.py:204: UserWarning: Node keys in 'layout_function' don't match node keys in the graph. These nodes may not be displayed correctly.\n", " species_renderer = from_networkx(DGspecies, positions, center=(0, 0))\n" ] }, { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"8a14219c-f1f8-47e8-8200-7499ef01a824\":{\"version\":\"3.7.3\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Plot\",\"id\":\"p1005\",\"attributes\":{\"width\":500,\"height\":500,\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1070\",\"attributes\":{\"start\":-128.43670745700337,\"end\":258.34476473245167}},\"y_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1071\",\"attributes\":{\"start\":-265.9849184269348,\"end\":120.79655376252022}},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1008\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1009\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1010\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GraphRenderer\",\"id\":\"p1048\",\"attributes\":{\"layout_provider\":{\"type\":\"object\",\"name\":\"StaticLayoutProvider\",\"id\":\"p1065\",\"attributes\":{\"graph_layout\":{\"type\":\"map\",\"entries\":[[0,[49.1383652384008,-244.77583575575733]],[1,[-15.49647042732679,5.688033184998785]],[2,[-1.1068759207674883,20.830426342531013]],[3,[1.669846012973646,11.56837349564175]],[4,[1.7544541180021025,44.8269484726372]],[5,[19.28690268330254,-148.1768853740673]],[6,[-40.21766943277983,9.118370513640762]],[7,[-14.925661990886908,35.93460027709698]],[8,[-29.69811208656169,62.88035660449466]],[9,[15.593813448754311,8.943643618509771]],[10,[41.456125303282406,16.767489288348724]],[11,[16.116600366324107,41.189884936661606]],[12,[33.30091148762931,85.58081229159669]],[13,[4.0312966993360595,-158.4802974459069]],[14,[180.97207845247016,46.440396722040575]],[15,[21.74842517358449,-169.02085390175293]],[16,[38.39882739487763,-154.19108386664684]],[17,[50.26000065636617,-171.13462558457616]],[18,[31.408574798282135,-130.8881567839088]],[19,[-25.373802677445518,16.87897086850963]],[20,[-51.064021177021836,3.3821858628506214]],[21,[-13.23533768695825,20.884028260623765]],[22,[0.525045597029705,1.2349146972319407]],[23,[11.232288518923989,23.59604669064812]],[24,[2.4108279493120692,28.428883082940413]],[25,[-18.773085295548775,51.748224725728086]],[26,[-38.16857436145286,71.42337398587668]],[27,[27.99216044028338,20.972332936150128]],[28,[52.279851263080914,13.338935601857969]],[29,[21.703577316154,64.41037917312657]],[30,[40.91360626763667,99.58747109134274]],[31,[11.208487677804678,-157.58627743962967]],[32,[13.44187785409987,-180.4783043394049]],[33,[40.226820770439645,-166.32708549025566]],[34,[58.30001328164778,-174.98705888405456]],[35,[30.82363437877638,-142.351069995173]],[36,[31.197561113909465,-123.28540339604544]]]}}},\"node_renderer\":{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1053\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1050\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1051\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1052\"},\"data\":{\"type\":\"map\",\"entries\":[[\"color\",[\"purple\",\"grey\",\"green\",\"green\",\"green\",\"orange\",\"cyan\",\"cyan\",\"cyan\",\"cyan\",\"cyan\",\"cyan\",\"cyan\",\"green\",\"green\",\"cyan\",\"green\",\"cyan\",\"cyan\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\"]],[\"type\",[\"nothing\",\"dna\",\"protein\",\"protein\",\"protein\",\"rna\",\"complex\",\"complex\",\"complex\",\"complex\",\"complex\",\"complex\",\"complex\",\"protein\",\"protein\",\"complex\",\"protein\",\"complex\",\"complex\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]],[\"species\",[\"nothing\",\"dna_mydna\",\"protein_hrpR\",\"protein_hrpS\",\"protein_RNAP\",\"rna_mydna\",\"complex_dna_mydna_protein_RNAP_\",\"complex_dna_mydna_protein_hrpR_\",\"complex_complex_dna_mydna_protein_hrpR__protein_RNAP_\",\"complex_dna_mydna_protein_hrpS_\",\"complex_complex_dna_mydna_protein_hrpS__protein_RNAP_\",\"complex_dna_mydna_protein_hrpR_protein_hrpS_\",\"complex_complex_dna_mydna_protein_hrpR_protein_hrpS__protein_RNAP_\",\"protein_Ribo\",\"protein_GFP\",\"complex_protein_Ribo_rna_mydna_\",\"protein_RNAase\",\"complex_complex_protein_Ribo_rna_mydna__protein_RNAase_\",\"complex_protein_RNAase_rna_mydna_\",\"dna[mydna]+protein[RNAP] <--> complex[dna[mydna]:protein[RNAP]]\",\"complex[dna[mydna]:protein[RNAP]] --> dna[mydna]+rna[mydna]+protein[RNAP]\",\"protein[hrpR]+dna[mydna] <--> complex[dna[mydna]:protein[hrpR]]\",\"protein[hrpS]+dna[mydna] <--> complex[dna[mydna]:protein[hrpS]]\",\"protein[hrpR]+complex[dna[mydna]:protein[hrpS]] <--> complex[dna[mydna]:protein[hrpR]:protein[hrpS]]\",\"protein[hrpS]+complex[dna[mydna]:protein[hrpR]] <--> complex[dna[mydna]:protein[hrpR]:protein[hrpS]]\",\"complex[dna[mydna]:protein[hrpR]]+protein[RNAP] <--> complex[complex[dna[mydna]:protein[hrpR]]:protein[RNAP]]\",\"complex[complex[dna[mydna]:protein[hrpR]]:protein[RNAP]] --> complex[dna[mydna]:protein[hrpR]]+rna[mydna]+protein[RNAP]\",\"complex[dna[mydna]:protein[hrpS]]+protein[RNAP] <--> complex[complex[dna[mydna]:protein[hrpS]]:protein[RNAP]]\",\"complex[complex[dna[mydna]:protein[hrpS]]:protein[RNAP]] --> complex[dna[mydna]:protein[hrpS]]+rna[mydna]+protein[RNAP]\",\"complex[dna[mydna]:protein[hrpR]:protein[hrpS]]+protein[RNAP] <--> complex[complex[dna[mydna]:protein[hrpR]:protein[hrpS]]:protein[RNAP]]\",\"complex[complex[dna[mydna]:protein[hrpR]:protein[hrpS]]:protein[RNAP]] --> complex[dna[mydna]:protein[hrpR]:protein[hrpS]]+rna[mydna]+protein[RNAP]\",\"rna[mydna]+protein[Ribo] <--> complex[protein[Ribo]:rna[mydna]]\",\"complex[protein[Ribo]:rna[mydna]] --> rna[mydna]+protein[GFP]+protein[Ribo]\",\"complex[protein[Ribo]:rna[mydna]]+protein[RNAase] <--> complex[complex[protein[Ribo]:rna[mydna]]:protein[RNAase]]\",\"complex[complex[protein[Ribo]:rna[mydna]]:protein[RNAase]] --> protein[Ribo]+protein[RNAase]\",\"rna[mydna]+protein[RNAase] <--> complex[protein[RNAase]:rna[mydna]]\",\"complex[protein[RNAase]:rna[mydna]] --> protein[RNAase]\"]],[\"image\",[\"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\",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]],[\"k_r\",[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,\"100\",\"None\",\"50\",\"50\",\"50\",\"50\",\"10\",\"None\",\"10\",\"None\",\"10\",\"None\",\"10.0\",\"None\",\"10\",\"None\",\"10\",\"None\"]],[\"k\",[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,\"100\",\"0.01\",\"100\",\"100\",\"100\",\"100\",\"100\",\"0.05\",\"100\",\"0.05\",\"100\",\"0.05\",\"100\",\"1.5\",\"100\",\"0.000555556\",\"100\",\"0.000555556\"]],[\"index\",[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1054\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1055\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1066\",\"attributes\":{\"size\":{\"type\":\"value\",\"value\":12},\"line_alpha\":{\"type\":\"value\",\"value\":0},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0}}}}},\"edge_renderer\":{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1060\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1057\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1058\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1059\"},\"data\":{\"type\":\"map\",\"entries\":[[\"color\",[\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\",\"gray\"]],[\"weight\",[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[\"start\",[1,1,1,2,2,3,3,4,4,4,4,5,5,6,6,7,7,7,8,8,9,9,9,10,10,11,11,11,12,12,13,15,15,15,16,16,17,17,18,18,19,19,19,20,20,20,21,21,21,22,22,22,23,23,23,24,24,24,25,25,25,26,26,26,27,27,27,28,28,28,29,29,29,30,30,30,31,31,31,32,32,32,33,33,33,34,34,35,35,35,36]],[\"end\",[19,21,22,21,23,22,24,19,25,27,29,31,35,19,20,21,24,25,25,26,22,23,27,27,28,23,24,29,29,30,31,31,32,33,33,35,33,34,35,36,1,4,6,1,5,4,2,1,7,3,1,9,2,9,11,3,7,11,7,4,8,7,5,4,9,4,10,9,5,4,11,4,12,11,5,4,5,13,15,5,14,13,15,16,17,13,16,5,16,18,16]],[\"xs\",[[-15.49647042732679,-23.057734688222176,-20.634064276373948,-25.373802677445518,-24.382759034061777,-23.057734688222176],[-15.49647042732679,-13.750459085307114,-11.399859913710728,-13.23533768695825,-16.345410365928856,-13.750459085307114],[-15.49647042732679,-2.847120638111594,-4.316414280966087,0.525045597029705,-2.9774420261644856,-2.847120638111594],[-1.1068759207674883,-9.73537186765422,-8.894204276207587,-13.23533768695825,-8.916301635153177,-9.73537186765422],[-1.1068759207674883,7.817021783624869,7.553760122474097,11.232288518923989,6.460223334033932,7.817021783624869],[1.669846012973646,0.9104380259357806,-1.4829528560285266,0.525045597029705,3.4866430039703635,0.9104380259357806],[1.669846012973646,2.257159052498089,4.718301226990691,2.4108279493120692,-0.27687723811637044,2.257159052498089],[1.7544541180021025,-22.93603342871679,-24.151724029358547,-25.373802677445518,-20.56396675992225,-22.93603342871679],[1.7544541180021025,-15.456531138895066,-13.871168291486752,-18.773085295548775,-15.468659006213693,-15.456531138895066],[1.7544541180021025,25.40247606694128,23.10649175755541,27.99216044028338,26.470022108446077,25.40247606694128],[1.7544541180021025,19.205916835206178,20.364863296540815,21.703577316154,16.8621844028264,19.205916835206178],[19.28690268330254,13.48840784274744,12.132333484060219,11.208487677804678,15.925981247094395,13.48840784274744],[19.28690268330254,27.699387085494184,28.085296115932405,30.82363437877638,25.83146543108563,27.699387085494184],[-40.21766943277983,-28.475479656575107,-28.052844104601785,-25.373802677445518,-30.36942141674525,-28.475479656575107],[-40.21766943277983,-47.97005583569599,-48.4049958286419,-51.064021177021836,-46.06746771392527,-47.97005583569599],[-14.925661990886908,-13.625965558505255,-16.202995130559028,-13.23533768695825,-11.234233558174475,-13.625965558505255],[-14.925661990886908,-0.8010736005847021,-2.5561348613995003,2.4108279493120692,-0.5696044875912643,-0.8010736005847021],[-14.925661990886908,-17.945678934606317,-15.320296944480383,-18.773085295548775,-20.17857385282001,-17.945678934606317],[-29.69811208656169,-21.22461320683693,-23.59035120959438,-18.773085295548775,-20.021777807966444,-21.22461320683693],[-29.69811208656169,-35.704277298019434,-33.34450785077588,-38.16857436145286,-36.895086988116304,-35.704277298019434],[15.593813448754311,3.6409873824120433,3.2414365118050483,0.525045597029705,5.518611090410203,3.6409873824120433],[15.593813448754311,12.230821358696039,14.863751841113956,11.232288518923989,10.071553213178628,12.230821358696039],[15.593813448754311,25.480121730990128,26.625134301662495,27.99216044028338,23.143502757367614,25.480121730990128],[41.456125303282406,31.333027187196734,32.87067143943608,27.99216044028338,31.380150793946804,31.333027187196734],[41.456125303282406,48.9432457986118,47.3969350761179,52.279851263080914,48.90681003679756,48.9432457986118],[16.116600366324107,12.168532117558167,9.981693656916402,11.232288518923989,14.799485496782317,12.168532117558167],[16.116600366324107,4.972414437122531,3.8763904727726426,2.4108279493120692,7.283548204236689,4.972414437122531],[16.116600366324107,20.88482411824594,23.121266846348178,21.703577316154,18.259999017908033,20.88482411824594],[33.30091148762931,23.38512484882208,21.59138681463191,21.703577316154,25.976518906137805,23.38512484882208],[33.30091148762931,39.24224520473532,41.04236946861847,40.91360626763667,36.64929695417279,39.24224520473532],[4.0312966993360595,7.735329077430468,7.220590218991321,11.208487677804678,6.602546338628117,7.735329077430468],[21.74842517358449,13.580637817163495,15.981476855978396,11.208487677804678,12.30504787756105,13.580637817163495],[21.74842517358449,15.49624745454673,13.9594662265551,13.44187785409987,18.00753594664312,15.49624745454673],[21.74842517358449,36.76342864121248,36.30262070087472,40.226820770439645,35.58134779092513,36.76342864121248],[38.39882739487763,39.705511514016884,37.10975431294465,40.226820770439645,42.05398134424868,39.705511514016884],[38.39882739487763,32.70989553591931,35.26315092070836,30.82363437877638,31.051403780437568,32.70989553591931],[50.26000065636617,43.38317996864381,45.21209838831007,40.226820770439645,43.05150672146492,43.38317996864381],[50.26000065636617,55.14364605140366,53.31473770007679,58.30001328164778,55.47530542017838,55.14364605140366],[31.408574798282135,31.002003620426535,28.547557684321507,30.82363437877638,33.54106048615354,31.002003620426535],[31.408574798282135,31.294665880744223,33.816734744289626,31.197561113909465,28.818659468979206,31.294665880744223],[-25.373802677445518,-17.812538416550133,-20.23620882839836,-15.49647042732679,-16.48751407071053,-17.812538416550133],[-25.373802677445518,-0.6833151307266239,0.5323754699151337,1.7544541180021025,-3.0553817995211663,-0.6833151307266239],[-25.373802677445518,-37.115992453650236,-37.538628005623565,-40.21766943277983,-35.22205069348009,-37.115992453650236],[-51.064021177021836,-18.989138386584976,-19.65579071326826,-15.49647042732679,-19.97926208338973,-18.989138386584976],[-51.064021177021836,17.81328517277292,15.196161192846793,19.28690268330254,19.731386460671903,17.81328517277292],[-51.064021177021836,-0.999064259386415,-0.10886491464953951,1.7544541180021025,-3.1954178910770086,-0.999064259386415],[-13.23533768695825,-4.60684174007152,-5.4480093315181515,-1.1068759207674883,-5.425911972572561,-4.60684174007152],[-13.23533768695825,-14.981349028977926,-17.33194820057431,-15.49647042732679,-12.386397748356185,-14.981349028977926],[-13.23533768695825,-14.535034119339901,-11.958004547286128,-14.925661990886908,-16.92676611967068,-14.535034119339901],[0.525045597029705,1.2844535840675708,3.6778444660318783,1.669846012973646,-1.291751393967013,1.2844535840675708],[0.525045597029705,-12.124304192185491,-10.655010549330997,-15.49647042732679,-11.9939828041326,-12.124304192185491],[0.525045597029705,12.477871663371973,12.877422533978967,15.593813448754311,10.600247955373813,12.477871663371973],[11.232288518923989,2.3083908145316308,2.571652475682402,-1.1068759207674883,3.665189264122568,2.3083908145316308],[11.232288518923989,14.59528060898226,11.962350126564344,15.593813448754311,16.754548754499673,14.59528060898226],[11.232288518923989,15.18035676768993,17.367195228331695,16.116600366324107,12.549403388465777,15.18035676768993],[2.4108279493120692,1.8235149097876258,-0.6376272647049752,1.669846012973646,4.357551200402084,1.8235149097876258],[2.4108279493120692,-11.713760440990137,-9.958699180175339,-14.925661990886908,-11.945229553983575,-11.713760440990137],[2.4108279493120692,13.555013878513645,14.651037842863534,16.116600366324107,11.243880111399488,13.555013878513645],[-18.773085295548775,-15.753068351829366,-18.3784503419553,-14.925661990886908,-13.520173433615675,-15.753068351829366],[-18.773085295548775,-1.5621000386516062,-3.1474628860599205,1.7544541180021025,-1.5499721713329804,-1.5621000386516062],[-18.773085295548775,-27.246584175273533,-24.880846172516083,-29.69811208656169,-28.44941957414402,-27.246584175273533],[-38.16857436145286,-16.843271682183026,-19.38946716332492,-14.925661990886908,-15.206710267607964,-16.843271682183026],[-38.16857436145286,18.400994386493636,15.772286000090109,19.28690268330254,20.609464822343785,18.400994386493636],[-38.16857436145286,-1.1583590999837667,-3.235285204565997,1.7544541180021025,-0.46315011158654884,-1.1583590999837667],[27.99216044028338,18.105852158047565,16.960839587375197,15.593813448754311,20.44247113167008,18.105852158047565],[27.99216044028338,4.344138491344205,6.640122800730072,1.7544541180021025,3.2765924498394057,4.344138491344205],[27.99216044028338,38.11525855636905,36.57761430412971,41.456125303282406,38.06813494961898,38.11525855636905],[52.279851263080914,19.068961127093075,19.595799728774395,15.593813448754311,20.19058765828818,19.068961127093075],[52.279851263080914,19.98738511243937,17.704105560418107,19.28690268330254,22.602944316293048,19.98738511243937],[52.279851263080914,4.7248332601265295,6.751612894481283,1.7544541180021025,4.107077615669156,4.7248332601265295],[21.703577316154,16.935353564232166,14.698910836129926,16.116600366324107,19.560178664570074,16.935353564232166],[21.703577316154,4.252114598949926,3.0931681376152875,1.7544541180021025,6.5958470313297,4.252114598949926],[21.703577316154,31.619363954961226,33.41310198915139,33.30091148762931,29.0279698976455,31.619363954961226],[40.91360626763667,17.484566038529067,15.507880176281866,16.116600366324107,20.110157766750778,17.484566038529067],[40.91360626763667,19.591251312833656,17.172906242656442,19.28690268330254,22.153966680465565,19.591251312833656],[40.91360626763667,3.7903191996395416,2.239632040339924,1.7544541180021025,6.30673585102343,3.7903191996395416],[11.208487677804678,17.006982518359777,18.363056877046997,19.28690268330254,14.569409114012823,17.006982518359777],[11.208487677804678,7.504455299710269,8.019194158149416,4.0312966993360595,8.63723803851262,7.504455299710269],[11.208487677804678,19.37627503422567,16.97543599541077,21.74842517358449,20.65186497382812,19.37627503422567],[13.44187785409987,18.66368969088829,20.975925257689738,19.28690268330254,16.05582787063175,18.66368969088829],[13.44187785409987,178.89325333661552,180.41145419560698,180.97207845247016,176.38894453688977,178.89325333661552],[13.44187785409987,5.4078962142605445,8.032907276980595,4.0312966993360595,3.43588655243992,5.4078962142605445],[40.226820770439645,25.211817302811657,25.672625243149415,21.74842517358449,26.39389815309901,25.211817302811657],[40.226820770439645,38.92013665130039,41.51589385237262,38.39882739487763,36.57166682106859,38.92013665130039],[40.226820770439645,47.103641458162,45.27472303849575,50.26000065636617,47.43531470534089,47.103641458162],[58.30001328164778,7.3798237454883076,8.901533084077984,4.0312966993360595,7.44651599238589,7.3798237454883076],[58.30001328164778,40.81870243479608,43.1988438285394,38.39882739487763,39.58644884279661,40.81870243479608],[30.82363437877638,22.411149976584735,22.025240946146514,19.28690268330254,24.27907163099329,22.411149976584735],[30.82363437877638,36.512566237734696,33.95931085294565,38.39882739487763,38.171057993216436,36.512566237734696],[30.82363437877638,31.23020555663198,33.684651492737004,31.408574798282135,28.691148690904974,31.23020555663198],[31.197561113909465,37.60457595138233,34.9814177999476,38.39882739487763,39.850974341066554,37.60457595138233]]],[\"ys\",[[5.688033184998785,14.254884538128149,15.286840255335093,16.87897086850963,11.978171699301747,14.254884538128149],[5.688033184998785,17.422142944071076,16.233112077341772,20.884028260623765,16.96899978926872,17.422142944071076],[5.688033184998785,2.172195275593062,-0.01419148310541174,1.2349146972319407,4.803188852810728,2.172195275593062],[20.830426342531013,20.86856010936185,23.364866971637504,20.884028260623765,18.364915801203175,20.86856010936185],[20.830426342531013,22.830570938740003,20.209539812386716,23.59604669064812,25.088492291385457,22.830570938740003],[11.56837349564175,4.713631799231164,5.813991264894437,1.2349146972319407,5.263430652171472,4.713631799231164],[11.56837349564175,24.93225815736547,23.993168137996467,28.428883082940413,24.21269513344501,24.93225815736547],[44.8269484726372,19.39040095711504,21.727323555545702,16.87897086850963,18.24479605736181,19.39040095711504],[44.8269484726372,50.62998122541923,52.73372443921745,51.748224725728086,47.995789929712146,50.62998122541923],[44.8269484726372,23.326804181773593,22.035461114034216,20.972332936150128,25.735010218808647,23.326804181773593],[44.8269484726372,61.95850394752648,59.5929270691933,64.41037917312657,63.16101347054733,61.95850394752648],[-148.1768853740673,-154.93072400550574,-152.67236770030152,-157.58627743962967,-155.9293965073626,-154.93072400550574],[-148.1768853740673,-143.92875147456573,-146.53454983356647,-142.351069995173,-142.0713394145919,-143.92875147456573],[9.118370513640762,15.257366750009203,12.65727250984158,16.87897086850963,17.088239622883847,15.257366750009203],[9.118370513640762,5.018455543152262,7.616519836059744,3.3821858628506214,3.196569348451391,5.018455543152262],[35.93460027709698,24.36216136129295,24.908082099408837,20.884028260623765,25.466121915904562,24.36216136129295],[35.93460027709698,29.81945434460618,27.855053459264337,28.428883082940413,32.44348424483115,29.81945434460618],[35.93460027709698,48.34743088989035,48.131838048016974,51.748224725728086,46.94982896095632,48.34743088989035],[62.88035660449466,54.246226106867645,53.0876085816015,51.748224725728086,56.589791312013155,54.246226106867645],[62.88035660449466,68.93796858973838,70.10869444295956,71.42337398587668,66.5882700666261,68.93796858973838],[8.943643618509771,2.8289369022555486,5.432678435000655,1.2349146972319407,0.981333027311601,2.8289369022555486],[8.943643618509771,20.24150765109339,20.159118681569517,23.59604669064812,18.732643196180874,20.24150765109339],[8.943643618509771,18.53519085514371,16.16283820839262,20.972332936150128,19.751464935954406,18.53519085514371],[16.767489288348724,19.928968484307635,22.067837582943632,20.972332936150128,17.29517080163884,19.928968484307635],[16.767489288348724,14.395848074333735,12.263236056866653,13.338935601857969,17.02981529182253,14.395848074333735],[41.189884936661606,26.96850097855426,28.437122241713215,23.59604669064812,27.099631386521533,26.96850097855426],[41.189884936661606,30.813893494965246,33.209272867239164,28.428883082940413,29.549863598938508,30.813893494965246],[41.189884936661606,61.00749169321847,59.61557402630592,64.41037917312657,60.78522145188886,61.00749169321847],[85.58081229159669,67.4799716371807,69.40912034379826,64.41037917312657,67.00690958284386,67.4799716371807],[85.58081229159669,96.51232033123075,94.58912936252177,99.58747109134274,96.97678802380942,96.51232033123075],[-158.4802974459069,-158.0189081558839,-160.6023467123736,-157.58627743962967,-155.64069156898185,-158.0189081558839],[-169.02085390175293,-160.1597777245218,-159.0757653734635,-157.58627743962967,-162.46455128683323,-160.1597777245218],[-169.02085390175293,-177.64465553534328,-175.5051662680561,-180.4783043394049,-178.43997998298016,-177.64465553534328],[-169.02085390175293,-166.83197652722038,-169.42557767421007,-166.32708549025566,-164.47787463245697,-166.83197652722038],[-154.19108386664684,-162.86612656834282,-162.41762303365633,-166.32708549025566,-161.67289552448096,-162.86612656834282],[-154.19108386664684,-145.29929299336254,-144.65122061500472,-142.351069995173,-147.3458794109232,-145.29929299336254],[-171.13462558457616,-167.83949965704727,-165.94367047651696,-166.32708549025566,-170.45275504538006,-167.83949965704727],[-171.13462558457616,-173.47466147998344,-175.3705003734529,-174.98705888405456,-170.861404330247,-173.47466147998344],[-130.8881567839088,-138.85561803389058,-137.899163113739,-142.351069995173,-138.15397631609636,-138.85561803389058],[-130.8881567839088,-126.78405608876272,-127.54450300675205,-123.28540339604544,-127.68322410223027,-126.78405608876272],[16.87897086850963,8.312119515380264,7.280163798173321,5.688033184998785,10.58883235420667,8.312119515380264],[16.87897086850963,42.31551838403179,39.97859578560112,44.8269484726372,43.46112328378502,42.31551838403179],[16.87897086850963,10.73997463214119,13.340068872308812,9.118370513640762,8.909101759266543,10.73997463214119],[3.3821858628506214,5.4616032259137555,2.9131359330350706,5.688033184998785,7.902661589118194,5.4616032259137555],[3.3821858628506214,-145.00222768658972,-145.30184901633825,-148.1768853740673,-143.19668114415308,-145.00222768658972],[3.3821858628506214,42.66636138913797,40.18711634393274,44.8269484726372,44.120714025916335,42.66636138913797],[20.884028260623765,20.845894493792926,18.349587631517274,20.830426342531013,23.349538801951603,20.845894493792926],[20.884028260623765,9.149918501551474,10.338949368280776,5.688033184998785,9.603061656353827,9.149918501551474],[20.884028260623765,32.45646717642779,31.91054643831191,35.93460027709698,31.352506621816186,32.45646717642779],[1.2349146972319407,8.089656393642526,6.989296927979253,11.56837349564175,7.539857540702218,8.089656393642526],[1.2349146972319407,4.750752606637663,6.9371393653361375,5.688033184998785,2.119759029419997,4.750752606637663],[1.2349146972319407,7.3496214134861635,4.7458798807410565,8.943643618509771,9.197225288430111,7.3496214134861635],[23.59604669064812,21.59590209443913,24.216933220792416,20.830426342531013,19.337980741793675,21.59590209443913],[23.59604669064812,12.298182658064501,12.380571627588374,8.943643618509771,13.807047112977017,12.298182658064501],[23.59604669064812,37.81743064875546,36.34880938559651,41.189884936661606,37.68630024078819,37.81743064875546],[28.428883082940413,15.064998421216693,16.004088440585697,11.56837349564175,15.784561445137154,15.064998421216693],[28.428883082940413,34.54402901543122,36.50842990077306,35.93460027709698,31.919999115206245,34.54402901543122],[28.428883082940413,38.80487452463677,36.40949515236285,41.189884936661606,40.068904420663515,38.80487452463677],[51.748224725728086,39.33539411293472,39.550986954808096,35.93460027709698,40.73299604186875,39.33539411293472],[51.748224725728086,45.945191972946056,43.84144875914784,44.8269484726372,48.57938326865314,45.945191972946056],[51.748224725728086,60.3823552233551,61.54097274862124,62.88035660449466,58.03879001820959,60.3823552233551],[71.42337398587668,38.86253010409885,38.18725279857375,35.93460027709698,40.92669521471106,38.86253010409885],[71.42337398587668,-144.79086019848972,-144.6205572719253,-148.1768853740673,-143.35497399076974,-144.79086019848972],[71.42337398587668,46.76744303772281,45.14710701588983,44.8269484726372,49.30826875586964,46.76744303772281],[20.972332936150128,11.380785699516188,13.753138346267278,8.943643618509771,10.164511618705491,11.380785699516188],[20.972332936150128,42.472477227013734,43.76382029475311,44.8269484726372,40.064271189978676,42.472477227013734],[20.972332936150128,17.810853740191217,15.67198464155522,16.767489288348724,20.44465142286001,17.810853740191217],[13.338935601857969,9.359995169169423,11.940993417003604,8.943643618509771,6.976496733662513,9.359995169169423],[13.338935601857969,-144.74769824495485,-143.43402197019526,-148.1768853740673,-144.43471115467642,-144.74769824495485],[13.338935601857969,42.97577377746871,44.658413127213464,44.8269484726372,40.41501435275,42.97577377746871],[64.41037917312657,44.59277241656971,45.984690083482256,41.189884936661606,44.81504265789932,44.59277241656971],[64.41037917312657,47.27882369823729,49.64440057657047,44.8269484726372,46.07631417521644,47.27882369823729],[64.41037917312657,82.51121982754256,80.582071120925,85.58081229159669,82.9842818818794,82.51121982754256],[99.58747109134274,44.411479249989846,46.152692582564775,41.189884936661606,44.198455907986265,44.411479249989846],[99.58747109134274,-144.6901430676009,-143.64576861890245,-148.1768853740673,-144.08055237537548,-144.6901430676009],[99.58747109134274,47.67392114011565,49.80335303654435,44.8269484726372,46.89497434849087,47.67392114011565],[-157.58627743962967,-150.83243880819123,-153.09079511339544,-148.1768853740673,-149.83376630633435,-150.83243880819123],[-157.58627743962967,-158.04766672965266,-155.46422817316298,-158.4802974459069,-160.42588331655472,-158.04766672965266],[-157.58627743962967,-166.4473536168608,-167.5313659679191,-169.02085390175293,-164.14258005454937,-166.4473536168608],[-180.4783043394049,-151.6209535450079,-152.8829668377917,-148.1768853740673,-151.9926625629142,-151.6209535450079],[-180.4783043394049,43.624639960938524,41.471926087869875,46.440396722040575,44.44167625337651,43.624639960938524],[-180.4783043394049,-161.69821195308538,-161.47814880727947,-158.4802974459069,-163.44471954288588,-161.69821195308538],[-166.32708549025566,-168.5159628647882,-165.9223617177985,-169.02085390175293,-170.8700647595516,-168.5159628647882],[-166.32708549025566,-157.65204278855967,-158.10054632324616,-154.19108386664684,-158.84527383242153,-157.65204278855967],[-166.32708549025566,-169.62221141778454,-171.51804059831485,-171.13462558457616,-167.00895602945175,-169.62221141778454],[-174.98705888405456,-159.49880941009135,-157.3485741772869,-158.4802974459069,-162.1321842432187,-159.49880941009135],[-174.98705888405456,-156.7197603566668,-155.5910275214333,-154.19108386664684,-159.04799186417395,-156.7197603566668],[-142.351069995173,-146.59920389467456,-143.99340553567382,-148.1768853740673,-148.45661595464838,-146.59920389467456],[-142.351069995173,-151.24286086845729,-151.8909332468151,-154.19108386664684,-149.19627445089662,-151.24286086845729],[-142.351069995173,-134.38360874519122,-135.3400636653428,-130.8881567839088,-135.08525046298544,-134.38360874519122],[-123.28540339604544,-150.78239428786358,-150.54124665651264,-154.19108386664684,-149.40660173723364,-150.78239428786358]]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1061\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1062\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"MultiLine\",\"id\":\"p1067\",\"attributes\":{\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":4},\"line_join\":{\"type\":\"value\",\"value\":\"round\"}}},\"selection_glyph\":{\"type\":\"object\",\"name\":\"MultiLine\",\"id\":\"p1068\",\"attributes\":{\"line_color\":{\"type\":\"value\",\"value\":\"#fdae61\"},\"line_width\":{\"type\":\"value\",\"value\":5},\"line_join\":{\"type\":\"value\",\"value\":\"round\"}}},\"hover_glyph\":{\"type\":\"object\",\"name\":\"MultiLine\",\"id\":\"p1069\",\"attributes\":{\"line_color\":{\"type\":\"value\",\"value\":\"#abdda4\"},\"line_width\":{\"type\":\"value\",\"value\":5},\"line_join\":{\"type\":\"value\",\"value\":\"round\"}}}}},\"selection_policy\":{\"type\":\"object\",\"name\":\"NodesAndLinkedEdges\",\"id\":\"p1092\"},\"inspection_policy\":{\"type\":\"object\",\"name\":\"EdgesAndLinkedNodes\",\"id\":\"p1093\"}}},{\"type\":\"object\",\"name\":\"GraphRenderer\",\"id\":\"p1012\",\"attributes\":{\"layout_provider\":{\"type\":\"object\",\"name\":\"StaticLayoutProvider\",\"id\":\"p1029\",\"attributes\":{\"graph_layout\":{\"type\":\"map\",\"entries\":[[0,[49.1383652384008,-244.77583575575733]],[1,[-15.49647042732679,5.688033184998785]],[2,[-1.1068759207674883,20.830426342531013]],[3,[1.669846012973646,11.56837349564175]],[4,[1.7544541180021025,44.8269484726372]],[5,[19.28690268330254,-148.1768853740673]],[6,[-40.21766943277983,9.118370513640762]],[7,[-14.925661990886908,35.93460027709698]],[8,[-29.69811208656169,62.88035660449466]],[9,[15.593813448754311,8.943643618509771]],[10,[41.456125303282406,16.767489288348724]],[11,[16.116600366324107,41.189884936661606]],[12,[33.30091148762931,85.58081229159669]],[13,[4.0312966993360595,-158.4802974459069]],[14,[180.97207845247016,46.440396722040575]],[15,[21.74842517358449,-169.02085390175293]],[16,[38.39882739487763,-154.19108386664684]],[17,[50.26000065636617,-171.13462558457616]],[18,[31.408574798282135,-130.8881567839088]],[19,[-25.373802677445518,16.87897086850963]],[20,[-51.064021177021836,3.3821858628506214]],[21,[-13.23533768695825,20.884028260623765]],[22,[0.525045597029705,1.2349146972319407]],[23,[11.232288518923989,23.59604669064812]],[24,[2.4108279493120692,28.428883082940413]],[25,[-18.773085295548775,51.748224725728086]],[26,[-38.16857436145286,71.42337398587668]],[27,[27.99216044028338,20.972332936150128]],[28,[52.279851263080914,13.338935601857969]],[29,[21.703577316154,64.41037917312657]],[30,[40.91360626763667,99.58747109134274]],[31,[11.208487677804678,-157.58627743962967]],[32,[13.44187785409987,-180.4783043394049]],[33,[40.226820770439645,-166.32708549025566]],[34,[58.30001328164778,-174.98705888405456]],[35,[30.82363437877638,-142.351069995173]],[36,[31.197561113909465,-123.28540339604544]]]}}},\"node_renderer\":{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1017\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1014\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1015\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1016\"},\"data\":{\"type\":\"map\",\"entries\":[[\"color\",[\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\",\"cornflowerblue\"]],[\"type\",[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]],[\"species\",[\"dna[mydna]+protein[RNAP] <--> complex[dna[mydna]:protein[RNAP]]\",\"complex[dna[mydna]:protein[RNAP]] --> dna[mydna]+rna[mydna]+protein[RNAP]\",\"protein[hrpR]+dna[mydna] <--> complex[dna[mydna]:protein[hrpR]]\",\"protein[hrpS]+dna[mydna] <--> complex[dna[mydna]:protein[hrpS]]\",\"protein[hrpR]+complex[dna[mydna]:protein[hrpS]] <--> complex[dna[mydna]:protein[hrpR]:protein[hrpS]]\",\"protein[hrpS]+complex[dna[mydna]:protein[hrpR]] <--> complex[dna[mydna]:protein[hrpR]:protein[hrpS]]\",\"complex[dna[mydna]:protein[hrpR]]+protein[RNAP] <--> complex[complex[dna[mydna]:protein[hrpR]]:protein[RNAP]]\",\"complex[complex[dna[mydna]:protein[hrpR]]:protein[RNAP]] --> complex[dna[mydna]:protein[hrpR]]+rna[mydna]+protein[RNAP]\",\"complex[dna[mydna]:protein[hrpS]]+protein[RNAP] <--> complex[complex[dna[mydna]:protein[hrpS]]:protein[RNAP]]\",\"complex[complex[dna[mydna]:protein[hrpS]]:protein[RNAP]] --> complex[dna[mydna]:protein[hrpS]]+rna[mydna]+protein[RNAP]\",\"complex[dna[mydna]:protein[hrpR]:protein[hrpS]]+protein[RNAP] <--> complex[complex[dna[mydna]:protein[hrpR]:protein[hrpS]]:protein[RNAP]]\",\"complex[complex[dna[mydna]:protein[hrpR]:protein[hrpS]]:protein[RNAP]] --> complex[dna[mydna]:protein[hrpR]:protein[hrpS]]+rna[mydna]+protein[RNAP]\",\"rna[mydna]+protein[Ribo] <--> complex[protein[Ribo]:rna[mydna]]\",\"complex[protein[Ribo]:rna[mydna]] --> rna[mydna]+protein[GFP]+protein[Ribo]\",\"complex[protein[Ribo]:rna[mydna]]+protein[RNAase] <--> complex[complex[protein[Ribo]:rna[mydna]]:protein[RNAase]]\",\"complex[complex[protein[Ribo]:rna[mydna]]:protein[RNAase]] --> protein[Ribo]+protein[RNAase]\",\"rna[mydna]+protein[RNAase] <--> complex[protein[RNAase]:rna[mydna]]\",\"complex[protein[RNAase]:rna[mydna]] --> protein[RNAase]\"]],[\"k_r\",[\"100\",\"None\",\"50\",\"50\",\"50\",\"50\",\"10\",\"None\",\"10\",\"None\",\"10\",\"None\",\"10.0\",\"None\",\"10\",\"None\",\"10\",\"None\"]],[\"k\",[\"100\",\"0.01\",\"100\",\"100\",\"100\",\"100\",\"100\",\"0.05\",\"100\",\"0.05\",\"100\",\"0.05\",\"100\",\"1.5\",\"100\",\"0.000555556\",\"100\",\"0.000555556\"]],[\"index\",[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1018\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1019\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1072\",\"attributes\":{\"size\":{\"type\":\"value\",\"value\":8},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"marker\":{\"type\":\"value\",\"value\":\"square\"}}},\"selection_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1073\",\"attributes\":{\"size\":{\"type\":\"value\",\"value\":8},\"fill_color\":{\"type\":\"value\",\"value\":\"#fdae61\"},\"marker\":{\"type\":\"value\",\"value\":\"square\"}}},\"hover_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1074\",\"attributes\":{\"size\":{\"type\":\"value\",\"value\":8},\"fill_color\":{\"type\":\"value\",\"value\":\"#abdda4\"},\"marker\":{\"type\":\"value\",\"value\":\"square\"}}}}},\"edge_renderer\":{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1024\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1021\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1022\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1023\"},\"data\":{\"type\":\"map\",\"entries\":[[\"start\",[]],[\"end\",[]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1025\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1026\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"MultiLine\",\"id\":\"p1020\"}}},\"selection_policy\":{\"type\":\"object\",\"name\":\"NodesOnly\",\"id\":\"p1027\"},\"inspection_policy\":{\"type\":\"object\",\"name\":\"NodesOnly\",\"id\":\"p1028\"}}},{\"type\":\"object\",\"name\":\"GraphRenderer\",\"id\":\"p1030\",\"attributes\":{\"layout_provider\":{\"type\":\"object\",\"name\":\"StaticLayoutProvider\",\"id\":\"p1047\",\"attributes\":{\"graph_layout\":{\"type\":\"map\",\"entries\":[[0,[49.1383652384008,-244.77583575575733]],[1,[-15.49647042732679,5.688033184998785]],[2,[-1.1068759207674883,20.830426342531013]],[3,[1.669846012973646,11.56837349564175]],[4,[1.7544541180021025,44.8269484726372]],[5,[19.28690268330254,-148.1768853740673]],[6,[-40.21766943277983,9.118370513640762]],[7,[-14.925661990886908,35.93460027709698]],[8,[-29.69811208656169,62.88035660449466]],[9,[15.593813448754311,8.943643618509771]],[10,[41.456125303282406,16.767489288348724]],[11,[16.116600366324107,41.189884936661606]],[12,[33.30091148762931,85.58081229159669]],[13,[4.0312966993360595,-158.4802974459069]],[14,[180.97207845247016,46.440396722040575]],[15,[21.74842517358449,-169.02085390175293]],[16,[38.39882739487763,-154.19108386664684]],[17,[50.26000065636617,-171.13462558457616]],[18,[31.408574798282135,-130.8881567839088]],[19,[-25.373802677445518,16.87897086850963]],[20,[-51.064021177021836,3.3821858628506214]],[21,[-13.23533768695825,20.884028260623765]],[22,[0.525045597029705,1.2349146972319407]],[23,[11.232288518923989,23.59604669064812]],[24,[2.4108279493120692,28.428883082940413]],[25,[-18.773085295548775,51.748224725728086]],[26,[-38.16857436145286,71.42337398587668]],[27,[27.99216044028338,20.972332936150128]],[28,[52.279851263080914,13.338935601857969]],[29,[21.703577316154,64.41037917312657]],[30,[40.91360626763667,99.58747109134274]],[31,[11.208487677804678,-157.58627743962967]],[32,[13.44187785409987,-180.4783043394049]],[33,[40.226820770439645,-166.32708549025566]],[34,[58.30001328164778,-174.98705888405456]],[35,[30.82363437877638,-142.351069995173]],[36,[31.197561113909465,-123.28540339604544]]]}}},\"node_renderer\":{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1035\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1032\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1033\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1034\"},\"data\":{\"type\":\"map\",\"entries\":[[\"type\",[\"nothing\",\"dna\",\"protein\",\"protein\",\"protein\",\"rna\",\"complex\",\"complex\",\"complex\",\"complex\",\"complex\",\"complex\",\"complex\",\"protein\",\"protein\",\"complex\",\"protein\",\"complex\",\"complex\"]],[\"species\",[\"nothing\",\"dna_mydna\",\"protein_hrpR\",\"protein_hrpS\",\"protein_RNAP\",\"rna_mydna\",\"complex_dna_mydna_protein_RNAP_\",\"complex_dna_mydna_protein_hrpR_\",\"complex_complex_dna_mydna_protein_hrpR__protein_RNAP_\",\"complex_dna_mydna_protein_hrpS_\",\"complex_complex_dna_mydna_protein_hrpS__protein_RNAP_\",\"complex_dna_mydna_protein_hrpR_protein_hrpS_\",\"complex_complex_dna_mydna_protein_hrpR_protein_hrpS__protein_RNAP_\",\"protein_Ribo\",\"protein_GFP\",\"complex_protein_Ribo_rna_mydna_\",\"protein_RNAase\",\"complex_complex_protein_Ribo_rna_mydna__protein_RNAase_\",\"complex_protein_RNAase_rna_mydna_\"]],[\"color\",[\"purple\",\"grey\",\"green\",\"green\",\"green\",\"orange\",\"cyan\",\"cyan\",\"cyan\",\"cyan\",\"cyan\",\"cyan\",\"cyan\",\"green\",\"green\",\"cyan\",\"green\",\"cyan\",\"cyan\"]],[\"image\",[\"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\",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]],[\"index\",[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1036\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1037\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1075\",\"attributes\":{\"size\":{\"type\":\"value\",\"value\":12},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"}}},\"selection_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1076\",\"attributes\":{\"size\":{\"type\":\"value\",\"value\":15},\"fill_color\":{\"type\":\"value\",\"value\":\"#fdae61\"}}},\"hover_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1077\",\"attributes\":{\"size\":{\"type\":\"value\",\"value\":15},\"fill_color\":{\"type\":\"value\",\"value\":\"#abdda4\"}}}}},\"edge_renderer\":{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1042\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1039\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1040\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1041\"},\"data\":{\"type\":\"map\",\"entries\":[[\"start\",[]],[\"end\",[]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1043\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1044\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"MultiLine\",\"id\":\"p1038\"}}},\"selection_policy\":{\"type\":\"object\",\"name\":\"NodesOnly\",\"id\":\"p1045\"},\"inspection_policy\":{\"type\":\"object\",\"name\":\"NodesOnly\",\"id\":\"p1046\"}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1011\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1078\",\"attributes\":{\"renderers\":[{\"id\":\"p1048\"}],\"tooltips\":null}},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1079\",\"attributes\":{\"renderers\":[{\"id\":\"p1030\"}],\"tooltips\":[[\"name\",\"@species\"],[\"type\",\"@type\"]],\"attachment\":\"right\"}},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1080\",\"attributes\":{\"renderers\":[{\"id\":\"p1012\"}],\"tooltips\":[[\"reaction\",\"@species\"],[\"type\",\"@type\"],[\"k_f\",\"@k\"],[\"k_r\",\"@k_r\"]],\"attachment\":\"right\"}},{\"type\":\"object\",\"name\":\"TapTool\",\"id\":\"p1081\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxSelectTool\",\"id\":\"p1082\",\"attributes\":{\"renderers\":\"auto\",\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1083\",\"attributes\":{\"syncable\":false,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"editable\":true,\"handles\":{\"type\":\"object\",\"name\":\"BoxInteractionHandles\",\"id\":\"p1089\",\"attributes\":{\"all\":{\"type\":\"object\",\"name\":\"AreaVisuals\",\"id\":\"p1088\",\"attributes\":{\"fill_color\":\"white\",\"hover_fill_color\":\"lightgray\"}}}}}}}},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1090\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1091\",\"attributes\":{\"renderers\":\"auto\"}}]}}}}]}};\n", " const render_items = [{\"docid\":\"8a14219c-f1f8-47e8-8200-7499ef01a824\",\"roots\":{\"p1005\":\"c0817452-9ae7-488e-a11a-7ac74b47e1a5\"},\"root_ids\":[\"p1005\"]}];\n", " void root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1005" } }, "output_type": "display_data" } ], "source": [ "from biocrnpyler.utils.plotting import generate_networkx_graph, graphPlot\n", "from bokeh.models import Plot, Range1d\n", "#below is CRN plotting code. set plotCRN to False to disable\n", "if plotCRN:\n", " DG, DGspec, DGrxn = generate_networkx_graph(CRN_extract_1)\n", " plot = Plot(width=500, height=500, x_range=Range1d(-500, 500), y_range=Range1d(-500, 500))\n", " graphPlot(DG, DGspec, DGrxn, plot)\n", " bokeh.io.show(plot)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{(None, 'phrpL_hrpR', 'cooperativity'): 1.0, (None, 'phrpL_hrpS', 'cooperativity'): 1.0, (None, 'phrpL_hrpR', 'ku'): 50, (None, 'phrpL_hrpS', 'ku'): 50, (None, 'phrpL_leak', 'ktx'): 0.01, (None, 'phrpL_leak', 'ku'): 100, ('translation_mm', 'B0030', 'ku'): 10.0, ('translation_mm', 'B0030', 'ktl'): 1.5, 'kb': 100, 'ku': 10, 'ktx': 0.05, 'ktl': 0.2, 'kdeg': 2}\n" ] }, { "data": { "image/png": "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eo2WS+Po6Ii2bdvi/fffL3V9eclA8R/4xMTEEgnXrVu3dJ9PVa1duxYAsHjxYixevLjU9ZMnTy5z/7fffhvr1q3DW2+9pUvoqmL79u0Ayu+SXXztxcnwg5KSkvTef//99zAzM8Ovv/6qlwRs27at0jE5OjrCwsIC69atK3N9RcqL9eGH9cPfvQfv9cNu3boFExOTMkszqsrBwaHM8wAVX2ujRo0gl8sxduxYhIWFlbpN48aN9d6X9rtWnofvcfEyhUIBKyurKh2rMjHUxvmodjERogahe/fusLOzQ2xsLKZNm1bl/cv6n2F5iv9YPtyVedWqVXrvLSws0KtXL/zwww94//33y3x4PP3009ixYweaNm1a5QdZ3759AQBff/21rgccABw9ehTnzp3TlXhUxb1797B161Z0794d7733Xon1a9aswTfffIMzZ84gICCg1GM4ODjgjTfewJw5c6pcNRkZGYk1a9agW7dueOyxx8rczt/fH66urti8eTPCw8N1y+Pj4xEVFaWXQBZ3xZbL5bplubm5+Oqrr0ocV6lUlvp9ePrpp/HBBx/AwcGhxEO8sjIzM7F9+3a9qppvv/0WJiYm6NmzZ7n7+vv7w8PDA99++y1ee+013fcwOzsbP/30k64nWU3o168fFi5ciOPHj6NDhw665V9++SVkMhn69OkDoOzfH5VKhT59+uDEiRNo27atriS3Jm3ZsgWLFi3SJbaZmZn45Zdf0KNHD737bKzno0fHRIgaBCsrK3z22WcYP3487t69i2effRbOzs64c+cOTp48iTt37mDlypVl7t+0aVNYWFjgm2++QcuWLWFlZQV3d/dyS2FatGiBpk2b4s0334QQAvb29vjll18QGRlZYtvFixfjscceQ+fOnfHmm2+iWbNmuH37NrZv345Vq1bB2toaERERiIyMRLdu3TBjxgz4+/sjLy8P165dw44dO/DFF1+UWb3m7++Pl156CZ999hlMTEwQEhKCa9euYe7cufDy8sKrr75a5c/0m2++QV5eHmbMmFFqiYyDgwO++eYbrF27FkuWLCnzODNnzsTy5cvx+++/l7peq9XqqhPVajXi4+Px+++/Y/PmzWjZsiU2b95cbpwmJiaYP38+Jk+ejGeffRYTJkxAWloa5s+fDzc3N712NAMHDsTixYvx/PPP46WXXkJqaio+/vjjUsfladOm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6+tb4hplMhnCwsIAGN/9279/PwYNGgR3d3fIZDJs27ZNb31l7plarcb06dPh6OgIS0tLDB48GDdu3KjDqyhbeddXUFCAN954A23atIGlpSXc3d0xbtw43Lp1S+8YvXv3LnFPn3vuuTq+krJVdA8r85001nsIoNTfR5lMhkWLFum2MeR7WJnngiH9HjIRksCmTZswc+ZMzJkzBydOnECPHj0QEhKC+Ph4qUOrsn379iEsLAyHDh1CZGQkCgsL0b9/f2RnZ+tt9+STTyIxMVH32rFjh0QRV13r1q31Yj99+rRu3UcffYTFixfj888/x9GjR+Hq6oonnnhCN0edMTh69Kje9UVGRgIARowYodvGmO5fdnY22rVrh88//7zU9ZW5ZzNnzsTWrVvx/fff4++//0ZWVhaefvppaDSaurqMMpV3fTk5OTh+/Djmzp2L48ePY8uWLbh48SIGDx5cYttJkybp3dNVq1bVRfiVUtE9BCr+ThrrPQSgd12JiYlYt24dZDIZhg8frredod7DyjwXDOr3UFCd69Spk5gyZYreshYtWog333xToohqTnJysgAg9u3bp1s2fvx4MWTIEOmCegTvvvuuaNeuXanrtFqtcHV1Ff/3f/+nW5aXlydsbW3FF198UUcR1rxXXnlFNG3aVGi1WiGEcd8/AGLr1q2695W5Z2lpacLMzEx8//33um1u3rwpTExMxB9//FFnsVfGw9dXmiNHjggA4vr167plvXr1Eq+88krtBldDSrvGir6T9e0eDhkyRPTt21dvmTHdw4efC4b2e8gSoTqWn5+P6Oho9O/fX295//79ERUVJVFUNSc9PR0AYG9vr7d87969cHZ2hp+fHyZNmoTk5GQpwquWS5cuwd3dHY0bN8Zzzz2Hq1evAgDi4uKQlJSkdy+VSiV69epltPcyPz8fX3/9NSZMmKA3ybAx378HVeaeRUdHo6CgQG8bd3d3BAQEGOV9TU9Ph0wmg52dnd7yb775Bo6OjmjdujVee+01oyrFBMr/Ttane3j79m389ttvmDhxYol1xnIPH34uGNrvISddrWMpKSnQaDRwcXHRW+7i4oKkpCSJoqoZQgiEh4fjscceQ0BAgG55SEgIRowYAR8fH8TFxWHu3Lno27cvoqOjDX601M6dO+PLL7+En58fbt++jffeew/dunXD2bNndfertHt5/fp1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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "if plotCRN:\n", " #this is just a normal time trace of the model, with both proteins present\n", " timepoints = np.linspace(0, 200, 1000)\n", " x0 = {\"dna_mydna\":5.0, \"protein_hrpS\":10, \"protein_hrpR\":7, \"protein_RNAP\":10., \"protein_Ribo\":50.,}\n", " Re1 = CRN_extract_1.simulate_with_bioscrape_via_sbml(timepoints, initial_condition_dict = x0)\n", " if Re1 is not None:\n", " plt.plot(timepoints,Re1[\"protein_GFP\"], label = \"protein_GFP\")\n", " plt.plot(timepoints,Re1[\"protein_hrpR\"], label = \"protein_hrpR\")\n", " plt.plot(timepoints,Re1[\"protein_hrpS\"], label = \"protein_hrpS\")\n", " plt.plot(timepoints,Re1[\"rna_mydna\"], label = \"rna_mydna\")\n", " plt.gca().set_yscale(\"log\")\n", " plt.title(\"Time trace of AND gate promoter phrpL\")\n", " plt.xlabel(\"time\")\n", " plt.ylabel(\"protein\")\n", " plt.legend()\n", " print(parameters)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Vary hrpR and hrpS\n", "To really test the combinatorial promoter we will vary the concentrations of hrpR and hrpS." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "if(make_heatmap):\n", " #aggregator data frame\n", " GFP_data = []\n", " #Different initial values of R and S\n", " conc_hrpR = np.linspace(0, 30, 9)\n", " conc_hrpS = np.linspace(0, 30, 9)\n", "\n", "\n", " for conc_R in conc_hrpR:\n", " x0[\"protein_hrpR\"] = conc_R\n", " for conc_S in conc_hrpS:\n", " x0[\"protein_hrpS\"] = conc_S #Change my initial condition dictionary\n", " Re1 = CRN_extract_1.simulate_with_bioscrape_via_sbml(timepoints, initial_condition_dict = x0)\n", " #now we are simulating over and over again, but only taking the final protein_GFP value\n", " if Re1 is not None:\n", " GFP_data.append( \n", " {'hrpS_conc':conc_S, 'hrpR_conc':conc_R,\n", " 'GFP_max': Re1[\"protein_GFP\"].values[-1]})\n", " GFP_max = pd.DataFrame(GFP_data, columns = ['hrpS_conc', 'hrpR_conc', 'GFP_max'])\n", " \n", " #now, you make a 2d plot with all the data\n", " if GFP_max is not None:\n", " data = pd.pivot_table(data = GFP_max, index = 'hrpS_conc',\n", " columns = 'hrpR_conc',\n", " values = 'GFP_max')\n", "\n", " ax = sns.heatmap(data,\n", " cmap = 'viridis',\n", " linewidths=.2)\n", " ax.set_ylim(9,-0.5) #not sure why this is needed\n", "\n", " ax.set(xlabel='hrpS', ylabel='hrpR')\n", " ax.set_title(\"hrpR, hrpS Combinatorial Promoter Heatmap\")\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#### Improving the AND Logic Model using the tx_capable_list keyword and more detailed parameters\n", "\n", "After careful inspection of the above heatmap, you might notice two important features:\n", "\n", "1) The promoter is on at all times except when no regulators are present\n", "\n", "2) the promoter is on very strongly for most possible concentrations\n", "\n", "We will adjust this model by changing the parameters and adding additional transcribable states\n", "\n", "1) increase the unbinding rate\n", "\n", "2) define single regulator bound promoters as being \"leak\"\n", "\n", "To do this, we will use the tx_capable_list keyword and modify the list of parameters\n", "\n", " phrpL = CombinatorialPromoter(... tx_capable_list = [[\"hrpR\",\"hrpS\"]] ...)\n", "\n", "Notice that there are 3 transcribable states, each regulator bound individually and both regulators bound together. Each of these combination of regulators requires their own parameters which are seen below in the newparam dictionary." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:678: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].\n", " warn(\n" ] } ], "source": [ "from biocrnpyler.core import Species\n", "newparam = {\n", " (None, 'phrpL_hrpR', 'cooperativity'): 1.0, \n", " (None, 'phrpL_hrpS', 'cooperativity'): 1.0, \n", " (None, 'phrpL_hrpR','ku'):5, #unbinding rate of each regulator\n", " (None, 'phrpL_hrpS','ku'):5,\n", " (None, 'phrpL_hrpR_hrpS_RNAP', 'ktx'): 0.17025, #these are the rates for the correctly bound promoter\n", " (None, 'phrpL_hrpR_hrpS_RNAP', 'ku'): 11.01321586,\n", " (None, 'phrpL_leak','ktx'):0.01, #this is the leak transcription rate\n", " (None, 'phrpL_leak', 'ku'): 100.,#this unbinding rate is now needed because we changed the tx_capable_list. Transcription from singly bound promoter uses the default \"ktx\"\n", "}\n", "\n", "#WARNING!!!\n", "#out of order regulators will not work! For example, phrpL_hrpR_hrpS_RNAP is correct, but phrpL_hrpS_hrpR_RNAP is not.\n", "\n", "parameters.update(newparam)\n", "#you can also define the ktx for the leak reaction. I don't think this is necessary\n", "# ('phrpL_hrpR_RNAP', 'ktx'): 0.17, \n", "# ('phrpL_hrpS_RNAP', 'ktx'): 0.17,\n", "\n", "phrpL = CombinatorialPromoter(\"phrpL\",[\"hrpR\",\"hrpS\"], \n", " tx_capable_list = [[Species(\"hrpR\",material_type=\"protein\"),\"hrpS\"]], #species can also be used\n", " leak=True) \n", "#now we are saying that there are more species that are capable of transcribing. Specifically, that we \n", "#can still transcribe when both are bound, but also when one or the other is bound.\n", "\n", "#this is our DNA\n", "dna = DNAassembly(\"mydna\",promoter=phrpL,rbs=\"B0030\",protein=\"GFP\")\n", "\n", "extract_1_TXTL = TxTlExtract(name = \"e coli extract 1\", components = [dna,hrpR,hrpS],\n", " parameters=parameters, parameter_file = \"default_parameters.txt\",\n", " overwrite_parameters = True) #Overwrite parameters will overwrite the parameters in the file with the dictionary\n", "CRN_extract_1 = extract_1_TXTL.compile_crn()\n", "\n", "if(make_heatmap):\n", " #aggregator data frame\n", " GFP_data = []\n", " #Different initial values of R and S\n", " conc_hrpR = np.linspace(0, 30, 9)\n", " conc_hrpS = np.linspace(0, 30, 9)\n", "\n", "\n", " for conc_R in conc_hrpR:\n", " x0[\"protein_hrpR\"] = conc_R \n", " for conc_S in conc_hrpS:\n", " x0[\"protein_hrpS\"] = conc_S #Change my initial condition dictionary\n", " Re1 = CRN_extract_1.simulate_with_bioscrape_via_sbml(timepoints, initial_condition_dict = x0)\n", " #now we are simulating over and over again, but only taking the final protein_GFP value\n", " GFP_data.append({'hrpS_conc':conc_S,\n", " 'hrpR_conc':conc_R,\n", " 'GFP_max': Re1[\"protein_GFP\"].values[-1]})\n", " GFP_max = pd.DataFrame(GFP_data, columns = ['hrpS_conc', 'hrpR_conc', 'GFP_max'])\n", "\n", " #now, you make a 2d plot with all the data\n", " data = pd.pivot_table(data = GFP_max, index = 'hrpS_conc',\n", " columns = 'hrpR_conc',\n", " values = 'GFP_max')\n", "\n", " ax = sns.heatmap(data,\n", " cmap = 'viridis',\n", " linewidths=.2)\n", " ax.set_ylim(9,-0.5) #not sure why this is needed\n", "\n", " ax.set(xlabel='hrpS', ylabel='hrpR')\n", " ax.set_title(\"hrpR, hrpS Combinatorial Promoter Heatmap\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 2: Using the tx_capable_list keyword to implement XOR logic\n", "In the following example, we consider a promoter phrpL which can be bound by the proteins hrpR and hrpS. When either one proteins or the other is present, but not both, transcription is activated. To do this, we pass in the following combinations to transcribable list:\n", "\n", " phrpL = CombinatorialPromoter(... tx_capable_list = [[\"hrpR\"],[\"hrpS\"]] ...)\n", "\n", "This ensures that only when hrpR or hrpS is individually bound to the promoter can it be transcribed." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:678: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].\n", " warn(\n" ] } ], "source": [ "newparam = {\n", " (None, 'phrpL_hrpR', 'cooperativity'): 1.0, \n", " (None, 'phrpL_hrpS', 'cooperativity'): 1.0, \n", " (None, 'phrpL_hrpR','ku'):3, #we have to massively decrease the unbinding rate to make this xor gate work\n", " (None, 'phrpL_hrpS','ku'):3,\n", " #(None, 'phrpL_hrpR_hrpS_RNAP', 'ku'): 100, #this time, this one is leak\n", " (None, 'phrpL_hrpR_RNAP', 'ktx'): 0.17, #these are now transcribing at high rates!\n", " (None, 'phrpL_hrpS_RNAP', 'ktx'): 0.17,\n", " (None, 'phrpL_hrpS_RNAP', 'ku'): 11.,\n", " (None, 'phrpL_hrpR_RNAP', 'ku'): 11,\n", " (None, 'phrpL','ku'):100,\n", " \n", "}\n", "\n", "parameters.update(newparam)\n", "phrpL = CombinatorialPromoter(\"phrpL\",[\"hrpR\",\"hrpS\"], \n", " tx_capable_list = [[\"hrpR\"],[\"hrpS\"]],\n", " leak=True) \n", "#this is our DNA\n", "dna = DNAassembly(\"mydna\",promoter=phrpL,rbs=\"B0030\",protein=\"GFP\")\n", "\n", "extract_1_TXTL = TxTlExtract(name = \"e coli extract 1\", components = [dna,hrpR,hrpS], \\\n", " parameters=parameters, parameter_file = \"default_parameters.txt\",\n", " overwrite_parameters = True) #Overwrite parameters will overwrite the parameters in the file with the dictionary\n", "\n", "CRN_extract_1 = extract_1_TXTL.compile_crn()\n", "\n", "\n", "if(make_heatmap):\n", " #aggregator data frame\n", " GFP_data = []\n", " #Different initial values of R and S\n", " conc_hrpR = np.linspace(0,30, 9)\n", " conc_hrpS = np.linspace(0, 30, 9)\n", " for conc_R in conc_hrpR:\n", " x0[\"protein_hrpR\"] = conc_R \n", " for conc_S in conc_hrpS:\n", " x0[\"protein_hrpS\"] = conc_S #Change my initial condition dictionary\n", " Re1 = CRN_extract_1.simulate_with_bioscrape_via_sbml(timepoints, initial_condition_dict = x0)\n", " #now we are simulating over and over again, but only taking the final protein_GFP value\n", " GFP_data.append({'hrpS_conc':conc_S,\n", " 'hrpR_conc':conc_R,\n", " 'GFP_max': Re1[\"protein_GFP\"].values[-1]})\n", " GFP_max = pd.DataFrame(GFP_data, columns = ['hrpS_conc', 'hrpR_conc', 'GFP_max'])\n", "\n", " #now, you make a 2d plot with all the data\n", " data = pd.pivot_table(data = GFP_max, index = 'hrpS_conc',\n", " columns = 'hrpR_conc',\n", " values = 'GFP_max')\n", "\n", " ax = sns.heatmap(data,\n", " cmap = 'viridis',\n", " linewidths=.2)\n", " ax.set_ylim(9,-0.5) #not sure why this is needed\n", "\n", " ax.set(xlabel='hrpS', ylabel='hrpR')\n", " ax.set_title(\"hrpR, hrpS Combinatorial Promoter Heatmap\")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# End" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 4 }